package 动态数组.栈.后缀表达式;

import 动态数组.栈.ArrayStack;
import 动态数组.栈.中缀转后缀.InfixToSuffix;

/**
 * 后缀表达式的计算
 */
public class SuffixCalculator {
    public static void main(String[] args) {
        String infix = "(10+20/2*3)/2+8";
        int result = evaluteExpress(infix);
        System.out.println(result);
    }

    private static int evaluteExpress(String infix) {
        //定义用于存储数字结果的栈
        ArrayStack<Integer> stack = new ArrayStack<>();
        //将表达式转换为后缀表达式，后在按空格切割
        String suffix = InfixToSuffix.fixToSuffix(infix);
        String[] tokens = suffix.split(" ");
        for (String token : tokens) {
            //跳过空格
            if (token.length() == 0){
                continue;
            }
            if (isOperator(token)){
                //操作符的换就弹出两个数字进行相应的计算后在将计算后的数字入栈
                processAnOperator(stack,token);
            }else {
                //数字直接入栈
                stack.push(new Integer(token));
            }
        }
        //返回栈中的最后一个数字
        return stack.pop();
    }

    /**
     * 判断是否为操作符
     * @param token 操作符
     * @return boolean
     */
    private static boolean isOperator(String token) {
        return "+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token);
    }

    /**
     * 弹出两个数字并计算，在将计算的数字入栈
     * @param stack 栈
     * @param token 操作符
     */
    private static void processAnOperator(ArrayStack<Integer> stack, String token) {
        int num2 = stack.pop();
        int num1 = stack.pop();
        switch (token){
            case "+":
                stack.push(num1 + num2);
                break;
            case "-":
                stack.push(num1 - num2);
                break;
            case "*":
                stack.push(num1 * num2);
                break;
            case "/":
                stack.push(num1 / num2);
                break;
            default:
                break;
        }

    }
}
